package gob.pgr.digester;

import java.util.Date;
import java.util.Locale;

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.apache.commons.digester3.Digester;
import org.apache.commons.digester3.annotations.FromAnnotationsRuleModule;
import org.apache.commons.digester3.binder.DigesterLoader;
import org.apache.commons.io.IOUtils;

public class Parser {
	private static Locale locale = new Locale("ES", "SV");
	private static DateLocaleConverter dateLocaleConverter = new DateLocaleConverter(locale, "dd/MM/yyyy");

	public static Libreria parse1(String xml) throws Exception {
		Libreria libreria = null;
		ConvertUtils.register(dateLocaleConverter, Date.class);
		Digester digester = new Digester();
		digester.addObjectCreate("libreria", Libreria.class);
		digester.addObjectCreate("libreria/libro", Libro.class);
		digester.addSetProperties("libreria/libro", "precio", "precio");
		digester.addSetProperties("libreria/libro", "isbn", "isbn");
		digester.addSetProperties("libreria/libro", "fechaPublicacion", "fechaPublicacion");
		digester.addBeanPropertySetter("libreria/libro/titulo", "titulo");
		digester.addBeanPropertySetter("libreria/libro/genero", "genero");
		digester.addObjectCreate("libreria/libro/autor", Autor.class);
		digester.addBeanPropertySetter("libreria/libro/autor/primerNombre", "primerNombre");
		digester.addBeanPropertySetter("libreria/libro/autor/segundoNombre", "segundoNombre");
		digester.addSetNext("libreria/libro/autor", "setAutor");
		digester.addSetNext("libreria/libro", "addLibro");
		libreria = (Libreria) digester.parse(IOUtils.toInputStream(xml));
		return libreria;
	}

	public static Libreria parse2(String xml) throws Exception {
		Libreria libreria = null;
		ConvertUtils.register(dateLocaleConverter, Date.class);
		ModuloLibreria moduloLibreria = new ModuloLibreria();
		DigesterLoader digesterLoader = DigesterLoader.newLoader(moduloLibreria);
		Digester digester = digesterLoader.newDigester();
		libreria = digester.parse(IOUtils.toInputStream(xml));
		return libreria;
	}
	
	public static Libreria parse3(String xml) throws Exception {
		Libreria libreria = null;
		ConvertUtils.register(dateLocaleConverter, Date.class);
		DigesterLoader digesterLoader = DigesterLoader.newLoader(new FromAnnotationsRuleModule() {
			@Override
			protected void configureRules() {
				bindRulesFrom(Libreria.class);
			}
		});
		Digester digester = digesterLoader.newDigester();
		libreria = digester.parse(IOUtils.toInputStream(xml));
		return libreria;
	}
}
